{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to use the Sliding Window GRU with NILMTK\n",
    "\n",
    "This is an example on how to train and use the Sliding Window GRU disaggregator on the [REDD](http://redd.csail.mit.edu/) dataset using [NILMTK](https://github.com/nilmtk/NILMTK/).\n",
    "\n",
    "This network was described in the []() paper."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First of all, we need to train the WindowGRUDisaggregator using the train data. For this example, both train and test data are consumption data of the microwave of the first REDD building."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import warnings; warnings.filterwarnings('ignore')\n",
    "\n",
    "from nilmtk import DataSet\n",
    "train = DataSet('redd.h5')\n",
    "train.set_window(end=\"30-4-2011\") #Use data only until 4/30/2011\n",
    "train_elec = train.buildings[1].elec"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we need to define the disaggregator model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/odysseas/anaconda2/envs/nilmtk-env/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py:1074: calling reduce_sum (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "keep_dims is deprecated, use keepdims instead\n",
      "WARNING:tensorflow:From /home/odysseas/anaconda2/envs/nilmtk-env/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py:1181: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "keep_dims is deprecated, use keepdims instead\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv1d_1 (Conv1D)            (None, 50, 16)            80        \n",
      "_________________________________________________________________\n",
      "bidirectional_1 (Bidirection (None, 50, 128)           31104     \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 50, 128)           0         \n",
      "_________________________________________________________________\n",
      "bidirectional_2 (Bidirection (None, 256)               197376    \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 256)               0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 128)               32896     \n",
      "_________________________________________________________________\n",
      "dropout_3 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 1)                 129       \n",
      "=================================================================\n",
      "Total params: 261,585\n",
      "Trainable params: 261,585\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "from windowgrudisaggregator import WindowGRUDisaggregator\n",
    "disaggregator = WindowGRUDisaggregator(window_size=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then train the model. We need to input the train data as well as their sample period. Also, we need to pass the desired number of training epochs. Finally, save the model for later use."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/2\n",
      "1003017/1003017 [==============================] - 1459s - loss: 7.4605e-04  \n",
      "Epoch 2/2\n",
      "1003017/1003017 [==============================] - 1443s - loss: 6.4579e-04  \n"
     ]
    }
   ],
   "source": [
    "train_mains = train_elec.mains().all_meters()[0] # The aggregated meter that provides the input\n",
    "train_meter = train_elec.submeters()['microwave'] # The microwave meter that is used as a training target\n",
    "\n",
    "disaggregator.train(train_mains, train_meter, epochs=2, sample_period=1)\n",
    "disaggregator.export_model(\"model-redd5.h5\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that the model is trained, we can use it to disaggregate energy data. Let's test it on the rest of the data from building 1.\n",
    "\n",
    "First we use the model to predict the microwave consumption. The results are saved automatically in a .h5 datastore."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "New sensible chunk: 121482\n",
      "New sensible chunk: 112661\n",
      "New sensible chunk: 87770\n",
      "New sensible chunk: 55\n",
      "New sensible chunk: 54084\n",
      "New sensible chunk: 2660\n",
      "New sensible chunk: 33513\n",
      "New sensible chunk: 138535\n",
      "New sensible chunk: 32514\n",
      "New sensible chunk: 27255\n",
      "New sensible chunk: 34833\n",
      "New sensible chunk: 100831\n",
      "New sensible chunk: 90\n"
     ]
    }
   ],
   "source": [
    "test = DataSet('redd.h5')\n",
    "test.set_window(start=\"30-4-2011\")\n",
    "test_elec = test.buildings[1].elec\n",
    "test_mains = test_elec.mains().all_meters()[0]\n",
    "\n",
    "disag_filename = 'disag-out.h5' # The filename of the resulting datastore\n",
    "from nilmtk.datastore import HDFDataStore\n",
    "output = HDFDataStore(disag_filename, 'w')\n",
    "\n",
    "# test_mains: The aggregated signal meter\n",
    "# output: The output datastore\n",
    "# train_meter: This is used in order to copy the metadata of the train meter into the datastore\n",
    "disaggregator.disaggregate(test_mains, output, train_meter, sample_period=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's plot the results and compare them to the ground truth signal.\n",
    "\n",
    "**Note:** Calling plot this way, downsamples the signal to reduce computing time. To plot the entire signal call\n",
    "```\n",
    "predicted.power_series_all_data().plot()\n",
    "ground_truth.power_series_all_data().plot()\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f89fdbab6d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "result = DataSet(disag_filename)\n",
    "res_elec = result.buildings[1].elec\n",
    "predicted = res_elec['microwave']\n",
    "ground_truth = test_elec['microwave']\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "predicted.plot()\n",
    "ground_truth.plot()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally let's see the metric results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "============ Recall: 1.0\n",
      "============ Precision: 0.742390932564\n",
      "============ Accuracy: 0.742390932564\n",
      "============ F1 Score: 0.852151969675\n",
      "============ Relative error in total energy: 0.854315367543\n",
      "============ Mean absolute error(in Watts): 30.7409502125\n"
     ]
    }
   ],
   "source": [
    "import metrics\n",
    "rpaf = metrics.recall_precision_accuracy_f1(predicted, ground_truth)\n",
    "print(\"============ Recall: {}\".format(rpaf[0]))\n",
    "print(\"============ Precision: {}\".format(rpaf[1]))\n",
    "print(\"============ Accuracy: {}\".format(rpaf[2]))\n",
    "print(\"============ F1 Score: {}\".format(rpaf[3]))\n",
    "\n",
    "print(\"============ Relative error in total energy: {}\".format(metrics.relative_error_total_energy(predicted, ground_truth)))\n",
    "print(\"============ Mean absolute error(in Watts): {}\".format(metrics.mean_absolute_error(predicted, ground_truth)))"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda env:nilmtk-env]",
   "language": "python",
   "name": "conda-env-nilmtk-env-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
